原文地址 zhuanlan.zhihu.com
题目
我们这里只分析第一问
- 图 1 给出 14 个地点, 其中实线代表各地点之间的路线情况。 若目前所有应急物资集中在第 9 个地点,配送车辆的最大载重量为 1000 千克,采取配送车辆(无人机不参与)的配送模式。请结合附件 1, 建立完成一次整体配送的数学模型, 并给出最优方案。
完成一次整体配送所需要的时间是按照配送车辆从出发开始至全部返回到出发地点的时间来计算。
附件 1:
邻接矩阵
每个地点的需求量
题目分析
- 所有地点的物资需求为 762kg,小于车辆的最大载重量 1000kg。也就是不需要车辆中途回去再取物资。
- 整个物资配送路径最终得是个回路。
- 由于给了个图,所以需要我们事先用图论相关算法求出任意两结点之间的最短路径。可以考虑迪杰斯特拉算法、弗洛伊德算法等。
- 得到任意两点的最短路径矩阵(二维数组)后,我们就可以规划路线了。
- 其实我们只要确定所有地点的访问顺序即可获得的具体的路线
- 所有地点的访问顺序其实是一个全排列问题,即所有可能是: $1 \times 13 \times 12 \times 11 \times 10 \times 9 \times 8 \times 7 \times 6 \times 5 \times 4 \times 3 \times 2 \times 1 \times 1=6,227,020,800$ 种访问顺序。其中第一个地点和最后一个地点的编号确定的。
- 但是暴力枚举是 10 亿的数量级,需要很久可能几十个小时。
- 所以我们要对枚举范围进行优化,即排除一些没必要的枚举。其实对于任意一个结点我们只需枚举最近的几个结点就可以了。比如:枚举最近的 4 个结点,原来有 13 个结点可以选择,现在我们只要枚举 4 结点就可以了。
首先,我们使用多次迪杰斯特拉算法得到了任意两节点之间的最短路径,然在在此基础上做访问顺序规划。我们以下的建模求解思路就是在暴力枚举的基础上做了剪枝优化,只枚举最近的 4 个结点的路线。当然,我们是有可能漏掉最佳答案的,但是一般情况下,这种可能性很小很小,所以我们是可以得到全局最优解的。
结果展示
最短距离矩阵
地点配送顺序
具体路线
$$
9 \rightarrow 8 \rightarrow 12 \rightarrow 11 \rightarrow 1 \rightarrow 7 \rightarrow 5 \rightarrow 2 \rightarrow 3 \rightarrow 5 \rightarrow 6 \rightarrow 4 \rightarrow 6 \rightarrow 10 \rightarrow 14 \rightarrow 13 \rightarrow 9
$$
总距离:582km
总耗时:11.64h
Python 代码
1 | from cmath import inf |